www.gusucode.com > VC++ Slider滑块控件自绘实例 > VC++ Slider滑块控件自绘实例/code/UI/BitWnd.cpp
#include "stdafx.h" #include "BitWnd.h" #include "BitItem.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CBitWnd::CBitWnd() : m_lpBit(NULL), m_bMute(FALSE), m_bCanMute(FALSE), m_hCursor(NULL), m_bNotify(FALSE), m_bTracking(FALSE), m_bAllocFlag(FALSE), m_nState(kNormalBit), m_bLDownNotify(FALSE) { } CBitWnd::~CBitWnd() { if( m_lpBit != NULL && m_bAllocFlag ) { delete m_lpBit; m_lpBit = NULL; } } BEGIN_MESSAGE_MAP(CBitWnd, CWnd) //{{AFX_MSG_MAP(CBitWnd) ON_WM_ERASEBKGND() ON_WM_SETCURSOR() ON_WM_MOUSEMOVE() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() //}}AFX_MSG_MAP ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover) ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave) END_MESSAGE_MAP() BOOL CBitWnd::Create(UINT wStyle, CWnd * pParentWnd, UINT nID) { LPCTSTR lpWndName = NULL; lpWndName = AfxRegisterWndClass(CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW, AfxGetApp()->LoadStandardCursor(IDC_ARROW), (HBRUSH)GetStockObject(BLACK_BRUSH), NULL); if( lpWndName == NULL ) return FALSE; // // 2.0 Create the window directly... //wStyle |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS; return CWnd::Create(lpWndName, NULL, wStyle, CRect(0, 0, 0, 0), pParentWnd, nID); } void CBitWnd::ReLoadBitItem(UINT nResID, int cx, int cy) { if( m_lpBit != NULL && m_bAllocFlag ) { delete m_lpBit; m_lpBit = NULL; m_bAllocFlag = FALSE; } ASSERT( m_hWnd != NULL ); m_lpBit = new CBitItem(nResID, cx, cy); m_bAllocFlag = TRUE; ASSERT( m_lpBit != NULL ); this->MoveWindow(0, 0, m_lpBit->GetItemWidth(), m_lpBit->GetItemHeight()); } void CBitWnd::SetBitItem(CBitItem * lpBit) { ASSERT( m_lpBit == NULL ); ASSERT( this->m_hWnd != NULL); m_lpBit = lpBit; this->MoveWindow(0, 0, m_lpBit->GetItemWidth(), m_lpBit->GetItemHeight()); } BOOL CBitWnd::OnEraseBkgnd(CDC* pDC) { (m_lpBit != NULL) ? m_lpBit->CopyItemIndex(pDC, m_nState, FALSE) : NULL; return TRUE; } BOOL CBitWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { if( m_hCursor != NULL ) { ::SetCursor(m_hCursor); return TRUE; } return FALSE; } LRESULT CBitWnd::OnMouseLeave(WPARAM wParam, LPARAM lParam) { m_nState = m_bMute ? kActiveBit : kNormalBit; m_nState = (m_lpBit->GetItemNums() > 1) ? m_nState : kNormalBit; m_bTracking = FALSE; this->Invalidate(); return 0; } LRESULT CBitWnd::OnMouseHover(WPARAM wParam, LPARAM lParam) { m_nState = (m_lpBit->GetItemNums() > 1) ? kHoverBit : kNormalBit; m_nState = m_bMute ? kActiveBit : m_nState; this->Invalidate(); return 0; } void CBitWnd::OnMouseMove(UINT nFlags, CPoint point) { if( !m_bTracking ) { TRACKMOUSEEVENT tme = {0}; tme.cbSize = sizeof(tme); tme.hwndTrack = m_hWnd; tme.dwFlags = TME_LEAVE | TME_HOVER; tme.dwHoverTime = 1; m_bTracking = _TrackMouseEvent(&tme); } if( m_bNotify ) { ASSERT( GetParent() != NULL ); this->ClientToScreen(&point); GetParent()->ScreenToClient(&point); GetParent()->SendMessage(WM_MOUSEMOVE, nFlags, MAKELPARAM(point.x, point.y)); } } void CBitWnd::OnLButtonDown(UINT nFlags, CPoint point) { m_nState = (m_lpBit->GetItemNums() > 2) ? kActiveBit : kNormalBit; m_nState = m_bMute ? kNormalBit : m_nState; m_bMute = m_bCanMute ? !m_bMute : m_bMute; this->Invalidate(); if( m_bLDownNotify ) { ASSERT( GetParent() != NULL ); GetParent()->SendMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd); } if( m_bNotify ) { ASSERT( GetParent() != NULL ); this->ClientToScreen(&point); GetParent()->ScreenToClient(&point); GetParent()->SendMessage(WM_LBUTTONDOWN, nFlags, MAKELPARAM(point.x, point.y)); } } void CBitWnd::OnLButtonUp(UINT nFlags, CPoint point) { if( !m_bMute ) { m_nState = (m_lpBit->GetItemNums() > 1) ? kHoverBit : kNormalBit; this->Invalidate(); } if( !m_bLDownNotify ) { ASSERT( GetParent() != NULL ); GetParent()->SendMessage(WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd); } if( m_bNotify ) { ASSERT( GetParent() != NULL ); this->ClientToScreen(&point); GetParent()->ScreenToClient(&point); GetParent()->SendMessage(WM_LBUTTONUP, nFlags, MAKELPARAM(point.x, point.y)); } }